package dao;

import java.util.ArrayList;
import java.util.Date;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.exception.JDBCConnectionException;

import dominio.Actividad;

import excepciones.DAOExcepcion;

public class DaoActividad {

	private static final String SQL_LISTAR_ACTIVIDAD = "From Actividad";
	private static final String SQL_LISTAR_ACTIVIDAD_ESTADO = "From Actividad Where Estado='";
	private static final String SQL_LISTAR_ACTIVIDAD_NOMBRE = "From Actividad Where Nombre='";
	private static final String SQL_LISTAR_ACTIVIDAD_ID = "From Actividad Where IdActividad='";
	
	private Session sesion = null; // Hibernate Session
	private Transaction tx = null; // Hibernate Transaction

	public void anadirActividad(Actividad actividad) throws DAOExcepcion {
		try {
			sesion = UtilidadHibernate.getSessionFactory().openSession();
			tx = sesion.beginTransaction();
			sesion.save(actividad);
			tx.commit();
		} 
		catch (JDBCConnectionException e){  // no puede conectar con la bd, error grave.
			System.out.println("Error al conectar con la base de datos " + e + "\n");
		}
		catch (HibernateException e) {
			tx.rollback();
			throw new DAOExcepcion(e);
		} 
		return;
	}
	
	public void actualizarActividad(Actividad actividad) throws DAOExcepcion {
		try {
			sesion = UtilidadHibernate.getSessionFactory().openSession();
			tx = sesion.beginTransaction();
			sesion.update(actividad);
			tx.commit();
		} 
		catch (JDBCConnectionException e){  // no puede conectar con la bd, error grave.
			System.out.println("Error al conectar con la base de datos " + e + "\n");
		}
		catch (HibernateException e) {
			tx.rollback();
			throw new DAOExcepcion(e);
		} 
		return;
	}
	
	public ArrayList listarActividades() throws DAOExcepcion{		
		try {
			sesion = UtilidadHibernate.getSessionFactory().openSession();
			sesion.beginTransaction();
			ArrayList ListaActividades = (ArrayList) sesion.createQuery(SQL_LISTAR_ACTIVIDAD).list();
			sesion.getTransaction().commit();
			sesion.close();
			return ListaActividades;
		} 
		catch (JDBCConnectionException e){  // no puede conectar con la bd, error grave.
			System.out.println("Error al conectar con la base de datos " + e + "\n");
		}
		catch (HibernateException e) {
			tx.rollback();
			throw new DAOExcepcion(e);
		} 
		return null;
	}
	
	//Estado: 0-Cerrada 1-Abierta 2-Completa
	public ArrayList listarActividadesPorEstado(Integer estado) throws DAOExcepcion{
		try {
			sesion = UtilidadHibernate.getSessionFactory().openSession();
			sesion.beginTransaction();
			ArrayList ListaActividades = (ArrayList) sesion.createQuery(SQL_LISTAR_ACTIVIDAD_ESTADO+estado.toString()+"'").list();
			sesion.getTransaction().commit();
			sesion.close();
			return ListaActividades;
		} 
		catch (JDBCConnectionException e){  // no puede conectar con la bd, error grave.
			System.out.println("Error al conectar con la base de datos " + e + "\n");
		}
		catch (HibernateException e) {
			tx.rollback();
			throw new DAOExcepcion(e);
		} 
		return null;
	}
	
	public ArrayList listarActividadesPorNombre(String nombre) throws DAOExcepcion{		
		try {
			sesion = UtilidadHibernate.getSessionFactory().openSession();
			sesion.beginTransaction();
			ArrayList ListaActividades = (ArrayList) sesion.createQuery(SQL_LISTAR_ACTIVIDAD_NOMBRE+nombre+"'").list();
			sesion.getTransaction().commit();
			sesion.close();
			return ListaActividades;
		} 
		catch (JDBCConnectionException e){  // no puede conectar con la bd, error grave.
			System.out.println("Error al conectar con la base de datos " + e + "\n");
		}
		catch (HibernateException e) {
			tx.rollback();
			throw new DAOExcepcion(e);
		} 
		return null;
	}
	
	public ArrayList listarActividadesPorId(Integer id) throws DAOExcepcion{		
		try {
			sesion = UtilidadHibernate.getSessionFactory().openSession();
			sesion.beginTransaction();
			ArrayList ListaActividades = (ArrayList) sesion.createQuery(SQL_LISTAR_ACTIVIDAD_ID+id+"'").list();
			sesion.getTransaction().commit();
			sesion.close();
			return ListaActividades;
		} 
		catch (JDBCConnectionException e){  // no puede conectar con la bd, error grave.
			System.out.println("Error al conectar con la base de datos " + e + "\n");
		}
		catch (HibernateException e) {
			tx.rollback();
			throw new DAOExcepcion(e);
		} 
		return null;
	}
}
